// Copyright 2003-2014 FreeHEP
package org.freehep.graphicsio.exportchooser;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.spi.IIORegistry;
import javax.imageio.spi.ImageReaderSpi;
import javax.imageio.spi.ImageWriterSpi;
import javax.imageio.spi.RegisterableService;
import javax.imageio.spi.ServiceRegistry;
import org.freehep.graphicsbase.util.export.ExportFileType;
import org.freehep.graphicsbase.util.export.ExportFileTypeRegistry;
import org.freehep.graphicsio.ImageGraphics2D;
/**
* This class does not work, since the ExportFileTypeRegistry stores Objects by
* class. If we automatically generate ImageFileTypes by ImageIO they end up
* being all different objects from the same class. The Registry currently then
* overwrites the first one with the second and so on. Sun Bug #Submitted.
*
* @author Mark Donszelmann
*/
public class ImageIOExportFileType implements RegisterableService {
private List<ImageWriterSpi> providerList = new ArrayList<ImageWriterSpi>();
/**
* This constructor will construct register all image formats available in
* ImageIO into ExportFileTypeRegistry. The ImageExportFileTypeRegistration
* will deregister itself immediately.
*/
public ImageIOExportFileType() {
// NOTE: registry is not valid yet, imageRegistry is valid
// run over all ImageWriterSpis and store their formats Alphabetically
// copy them at this time to avoid a ConcurrentModificationException
// see https://github.com/freehep/freehep-vectorgraphics/issues/23
IIORegistry imageRegistry = IIORegistry.getDefaultInstance();
Iterator<?> providers = imageRegistry.getServiceProviders(
ImageWriterSpi.class, false);
while (providers.hasNext()) {
ImageWriterSpi writerSpi = (ImageWriterSpi) providers.next();
providerList.add(writerSpi);
}
}
@SuppressWarnings("unchecked")
public void onRegistration(ServiceRegistry registry, Class<?> category) {
// run over all ImageWriterSpis and store their formats Alphabetically
Iterator<ImageWriterSpi> providers = providerList.iterator();
ExportFileTypeRegistry exportRegistry = ExportFileTypeRegistry.getDefaultInstance(null);
while (providers.hasNext()) {
ImageWriterSpi writerSpi = (ImageWriterSpi) providers.next();
String[] formats = writerSpi.getFileSuffixes();
if ((formats != null) && (formats[0] != null)) {
exportRegistry.add(new ImageExportFileType(writerSpi));
} else {
System.err.println(getClass() + ": Cannot register "
+ writerSpi + " because it has no filesuffixes.");
}
}
registry.deregisterServiceProvider(this, (Class<ImageIOExportFileType>)category);
}
public void onDeregistration(ServiceRegistry registry, Class<?> category) {
}
public static void main(String[] args) throws Exception {
System.out.println("WRITERS");
IIORegistry imageRegistry = IIORegistry.getDefaultInstance();
Iterator<?> providers = imageRegistry.getServiceProviders(
ImageWriterSpi.class, false);
while (providers.hasNext()) {
ImageWriterSpi writerSpi = (ImageWriterSpi) providers.next();
System.out.println(" " + writerSpi);
System.out.println(" " + writerSpi.getDescription(Locale.US));
System.out.print(" ");
String[] formats = writerSpi.getFileSuffixes();
for (int i = 0; i < formats.length; i++) {
System.out.print(formats[i] + ", ");
}
System.out.println();
}
System.out.println();
System.out.println("MIMETYPES");
String[] formats = ImageIO.getWriterMIMETypes();
for (int i = 0; i < formats.length; i++) {
System.out.println(" " + formats[i]);
ImageWriter writer = ImageGraphics2D
.getPreferredImageWriterForMIMEType(formats[i]);
String[] suffixes = writer.getOriginatingProvider()
.getFileSuffixes();
System.out.print(" ");
for (int j = 0; j < suffixes.length; j++) {
System.out.print(suffixes[j] + " ");
}
System.out.println();
System.out.println(" " + writer);
}
System.out.println();
System.out.println("READERS");
providers = imageRegistry.getServiceProviders(ImageReaderSpi.class,
false);
while (providers.hasNext()) {
System.out.println(" " + providers.next());
}
System.out.println();
System.out.println("All ExportFileTypes");
List<?> exportFileTypes = ExportFileType.getExportFileTypes();
Iterator<?> iterator = exportFileTypes.iterator();
while (iterator.hasNext()) {
ExportFileType type = (ExportFileType)iterator.next();
System.out.println(" " + type);
}
}
}